package com.fand.persistent.support;

import java.util.Map;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;

import org.apache.commons.lang.StringUtils;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.util.CollectionUtils;

import com.fand.context.ContextHolder;
import com.fand.router.support.RouterKeySupport;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Slf4j
public class NamedParameterJdbcTemplateRouterSupport {
	private NamedParameterJdbcTemplate defaultTargetNamedParameterJdbcTemplate;

	/**
	 * 路由键名
	 */
	private RouterKeySupport routerKeySupport;

	private Map<String, NamedParameterJdbcTemplate> targetNamedParameterJdbcTemplates;

	/**
	 * 使用对应目标数据源的NamedParameterJdbcTemplateSupport
	 * 
	 * @param value
	 *            值
	 * @param model
	 *            model
	 * @return NamedParameterJdbcTemplate
	 */
	public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate(final String value, final Object model) {
		if (StringUtils.isBlank(value)) {
			return this.defaultTargetNamedParameterJdbcTemplate;
		}

		if (CollectionUtils.isEmpty(this.targetNamedParameterJdbcTemplates)) {
			return this.defaultTargetNamedParameterJdbcTemplate;
		}

		if (this.routerKeySupport == null) {
			return this.defaultTargetNamedParameterJdbcTemplate;
		}

		String groupId = null;

		if (StringUtils.isNotBlank(ContextHolder.getId())) {
			groupId = this.routerKeySupport.getGroupId(ContextHolder.getId());
		}

		final String targetNamedParameterJdbcTemplateKey = this.routerKeySupport.getKey(groupId, value, model);

//		if (NamedParameterJdbcTemplateRouterSupport.log.isDebugEnabled()) {
			NamedParameterJdbcTemplateRouterSupport.log.debug(value + "的标识为：" + targetNamedParameterJdbcTemplateKey);
//		}

		if (StringUtils.isBlank(targetNamedParameterJdbcTemplateKey)) {
			return this.defaultTargetNamedParameterJdbcTemplate;
		}

		if (this.targetNamedParameterJdbcTemplates.containsKey(targetNamedParameterJdbcTemplateKey)) {
			return this.targetNamedParameterJdbcTemplates.get(targetNamedParameterJdbcTemplateKey);
		}

		return this.defaultTargetNamedParameterJdbcTemplate;
	}
}
